﻿Public Class Animaux_Screen

    Private WithEvents _ctrl As Animaux_CTRL
    'Flag d'ajout TRUE en cas d'ajout
    Private _flagAjout As Boolean = False
    'Booleen de test d'initialisation de la fenetre
    Private _initEnCours As Boolean

#Region "Cycle de vie de la fenetre Animaux"

    ''' <summary>
    ''' Constructeur surchagé de la fenetre Animaux (pour recevoir son controleur)
    ''' </summary>
    ''' <param name="controleur"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal controleur As Animaux_CTRL)

        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        _ctrl = controleur

    End Sub

    ''' <summary>
    ''' Action realiser au chargement de la fenetre Animaux (Affichage divers)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Animaux_Screen_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        _initEnCours = True

        BarBoutonANIMAUX.PnlNavigation.Visible = True
        BarBoutonANIMAUX.PnlGestionDonnées.Visible = True

        TXTcodeclient.Text = _ctrl.clientCourant.CodeClient.ToString
        TXTnom.Text = _ctrl.clientCourant.NomClient
        TXTprenom.Text = _ctrl.clientCourant.PrenomClient

        CMBsexe.Items.Add("M")
        CMBsexe.Items.Add("F")
        CMBsexe.Items.Add("H")

        CMBespece.Enabled = False
        CMBrace.Enabled = False
        CMBsexe.Enabled = False

        CMBespece.DataSource = _ctrl.listeEspece
        CMBrace.DataSource = _ctrl.ListeRace

        If _ctrl.clientCourant.Animaux.Count = 0 Then

            BarBoutonANIMAUX.BtnAjouter.PerformClick()

        End If

        If _flagAjout Then



        End If

        afficherAnimalCourant()

        _initEnCours = False

    End Sub

    ''' <summary>
    ''' Action realiser à la suppression de la fenetre Animaux (dispose du controleur)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Animaux_Screen_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed

        _ctrl = Nothing

    End Sub

#End Region

#Region "BarBouton"

    ''' <summary>
    ''' Procèdure de controle de navigation
    ''' envoi le nouvel index au controleur en fonction du bouton cliqué
    ''' et de paramètres triviaux
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BarBoutonANIMAUX_Navigation(ByVal sender As Object, ByVal e As navigationEventArgs) Handles BarBoutonANIMAUX.Navigation

        BarBoutonANIMAUX.BtnPrecedent.Enabled = True
        BarBoutonANIMAUX.BtnPremier.Enabled = True
        BarBoutonANIMAUX.BtnSuivant.Enabled = True
        BarBoutonANIMAUX.BtnDernier.Enabled = True

        Select Case e.navigation

            Case navigationEnum.Premier
                _ctrl.index = 0
                BarBoutonANIMAUX.BtnPrecedent.Enabled = False
                BarBoutonANIMAUX.BtnPremier.Enabled = False

            Case navigationEnum.Suivant
                If _ctrl.index = _ctrl.listeAnimaux.Count - 2 Then
                    _ctrl.index = _ctrl.listeAnimaux.Count - 1
                    BarBoutonANIMAUX.BtnSuivant.Enabled = False
                    BarBoutonANIMAUX.BtnDernier.Enabled = False
                Else
                    _ctrl.index += 1
                End If

            Case navigationEnum.Precedent
                If _ctrl.index = 1 Then
                    _ctrl.index = 0
                    BarBoutonANIMAUX.BtnPrecedent.Enabled = False
                    BarBoutonANIMAUX.BtnPremier.Enabled = False
                Else
                    _ctrl.index -= 1
                End If


            Case navigationEnum.Dernier
                _ctrl.index = _ctrl.listeAnimaux.Count - 1
                BarBoutonANIMAUX.BtnSuivant.Enabled = False
                BarBoutonANIMAUX.BtnDernier.Enabled = False
        End Select

        afficherAnimalCourant()

    End Sub

    ''' <summary>
    ''' Procedure gerant les differentes action effectué par l'utilisateur sur la barre de bouton
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BarBoutonANIMAUX_Action(ByVal sender As Object, ByVal e As ActionEventArgs) Handles BarBoutonANIMAUX.Action

        CMBespece.Enabled = False
        CMBrace.Enabled = False
        CMBsexe.Enabled = False

        Select Case e.Action
            'Bouton ajouter
            Case actionEnum.Ajouter
                effacerAnimalCourant()
                _flagAjout = True

                CMBespece.Enabled = True
                CMBrace.Enabled = True
                CMBsexe.Enabled = True
                CMBsexe.SelectedIndex = 0
                TXTcodeanimal.Text = "Le code va être généré automatiquement"
                TXTtatouage.Enabled = True
                TXTtatouage.ReadOnly = False
                'desactivation de la navigation pendant l'ajout
                With BarBoutonANIMAUX
                    .BtnPrecedent.Enabled = False
                    .BtnPremier.Enabled = False
                    .BtnSuivant.Enabled = False
                    .BtnDernier.Enabled = False
                    .BtnAjouter.Enabled = False
                    .BtnAnnuler.Enabled = True
                End With
                'bouton enregister
            Case actionEnum.Enregistrer
                If _flagAjout = True Then
                    If isSaisieOk() Then
                        _ctrl.ajoutAnimal(TXTnomanimal.Text, TXTcouleur.Text, CMBrace.Text, CMBespece.Text, CMBsexe.SelectedItem, TXTtatouage.Text)
                        _flagAjout = False
                        _ctrl.index = _ctrl.listeAnimaux.Count - 1
                        afficherAnimalCourant()
                    End If
                Else
                    If isSaisieOk() Then
                        _ctrl.modifAnimal(TXTnomanimal.Text, TXTcouleur.Text, CMBsexe.SelectedItem, TXTtatouage.Text)
                        afficherAnimalCourant()
                    End If
                End If

                BarBoutonANIMAUX.BtnAjouter.Enabled = True

                'bouton supprimer (archiver)
            Case actionEnum.Supprimer

                Dim reponse As DialogResult = MessageBox.Show("Êtes vous sur de vouloir archiver cet animal ? (pas de retour possible)", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                If reponse = Windows.Forms.DialogResult.Yes Then
                    'verification si le posseseur de l'animal à encore des factures a payées
                    If _ctrl.animalCourant.isMonMaitreArchivable Then
                        'archivage de l'animal
                        _ctrl.archiverAnimal()
                        'selection du premier animal de la liste
                        _ctrl.index = 0
                        'refresh de l'affichage
                        afficherAnimalCourant()
                    Else
                        MessageBox.Show("Impossible d'archiver cet animal tant que son maitre n'a pas payé toutes ses factures", "!", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    End If

                End If
                'bouton annuler
            Case actionEnum.Annuler
                'annulation du mode ajout
                If _flagAjout = True Then
                    _flagAjout = False
                End If
                
                'refresh de l'affichage
                afficherAnimalCourant()
        End Select

    End Sub

#End Region

#Region "Affichage / Saisie"

    ''' <summary>
    ''' Procedure d'affichage de l'animal courant sur la fenetre
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub afficherAnimalCourant()

        CMBespece.DataSource = Nothing
        CMBespece.DataSource = _ctrl.listeEspece

        If _ctrl.animalCourant IsNot Nothing Then

            With _ctrl.animalCourant

                TXTcodeanimal.Text = .CodeAnimal.ToString
                TXTnomanimal.Text = .NomAnimal
                TXTcouleur.Text = .Couleur
                TXTtatouage.Text = .Tatouage

                CMBespece.SelectedItem = .espece
                CMBrace.SelectedItem = .race
                CMBsexe.SelectedItem = .Sexe

            End With

            If Not String.IsNullOrEmpty(TXTtatouage.Text) Then
                TXTtatouage.Enabled = False
                TXTtatouage.BackColor = Color.White
            Else
                TXTtatouage.Enabled = True
            End If

        Else
            effacerAnimalCourant()
        End If

        With BarBoutonANIMAUX

            If _ctrl.listeAnimaux.Count = 1 Or _ctrl.listeAnimaux.Count = 0 Then
                .BtnPrecedent.Enabled = False
                .BtnPremier.Enabled = False
                .BtnSuivant.Enabled = False
                .BtnDernier.Enabled = False
            ElseIf _ctrl.index = _ctrl.listeAnimaux.Count - 1 Then
                .BtnPrecedent.Enabled = True
                .BtnPremier.Enabled = True
                .BtnSuivant.Enabled = False
                .BtnDernier.Enabled = False
            ElseIf _ctrl.index = 0 Then
                .BtnPrecedent.Enabled = False
                .BtnPremier.Enabled = False
                .BtnSuivant.Enabled = True
                .BtnDernier.Enabled = True
            Else
                .BtnPrecedent.Enabled = True
                .BtnPremier.Enabled = True
                .BtnSuivant.Enabled = True
                .BtnDernier.Enabled = True
            End If
            .BtnEnregistrer.Enabled = False
            .BtnAnnuler.Enabled = False
            .BtnAjouter.Enabled = True
            .BtnSupprimer.Enabled = True
        End With

    End Sub

    '''<summary>
    ''' Fonction de verification de la saisie de l'utilisateur utilisation d'un error provider
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function isSaisieOk() As Boolean
        isSaisieOk = True

        'Nom, espece ,race et sexe obligatoire à la saisie pour un ajout ou une modification

        If String.IsNullOrEmpty(TXTnomanimal.Text) Then
            EPanimaux.SetError(TXTnomanimal, "Veuillez saisir le nom de l'animal")
            isSaisieOk = False
        ElseIf TXTnomanimal.Text.Length > 30 Then
            EPanimaux.SetError(TXTnomanimal, "Nom trop long")
            isSaisieOk = False
        Else
            EPanimaux.SetError(TXTnomanimal, "")
        End If

        If String.IsNullOrEmpty(CMBespece.Text) Then
            EPanimaux.SetError(CMBespece, "Veuillez saisir ou selectionner l'espece de l'animal")
            isSaisieOk = False
        ElseIf CMBespece.Text.Length > 20 Then
            EPanimaux.SetError(CMBespece, "Nom de l'espece trop long")
            isSaisieOk = False
        Else
            EPanimaux.SetError(CMBespece, "")
        End If

        If String.IsNullOrEmpty(CMBrace.Text) Then
            EPanimaux.SetError(CMBrace, "Veuillez saisir ou selectionner la race de l'animal")
            isSaisieOk = False
        ElseIf CMBrace.Text.Length > 20 Then
            EPanimaux.SetError(CMBespece, "Nom de la race trop long")
            isSaisieOk = False
        Else
            EPanimaux.SetError(CMBrace, "")
        End If

        If TXTtatouage.Text.Length > 10 Then
            EPanimaux.SetError(TXTtatouage, "Tatouage trop long")
            isSaisieOk = False
        End If

    End Function

    ''' <summary>
    ''' Procedure d'effacement de l'animal courant
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub effacerAnimalCourant()

        TXTcodeanimal.Text = ""
        TXTnomanimal.Text = ""
        TXTcouleur.Text = ""
        TXTtatouage.Text = ""

        CMBespece.SelectedIndex = -1
        CMBespece.Text = ""
        CMBrace.SelectedIndex = -1
        CMBrace.Text = ""
        CMBsexe.SelectedIndex = -1
        CMBsexe.Text = ""

        BarBoutonANIMAUX.BtnEnregistrer.Enabled = False
        BarBoutonANIMAUX.BtnAjouter.Enabled = True
        BarBoutonANIMAUX.BtnAnnuler.Enabled = False
        BarBoutonANIMAUX.BtnSupprimer.Enabled = False

    End Sub

    ''' <summary>
    ''' Procedure d'activation du bouton enregistrer (uniquement en cas de modification sur un champ
    ''' de la fenetre)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub BTNsauverEnabled(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TXTnomanimal.TextChanged, TXTcouleur.TextChanged, CMBespece.TextChanged, TXTtatouage.TextChanged, CMBsexe.SelectedIndexChanged, CMBrace.SelectedIndexChanged

        If Not _initEnCours Then
            BarBoutonANIMAUX.BtnEnregistrer.Enabled = True
            BarBoutonANIMAUX.BtnSupprimer.Enabled = False
            BarBoutonANIMAUX.BtnAnnuler.Enabled = True
            BarBoutonANIMAUX.BtnAjouter.Enabled = False
        End If

    End Sub

    ''' <summary>
    ''' Procedure qui va rafraichir la CMBrace en fonction de l'espece selectionné (ou saisie)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub CMBespece_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CMBespece.TextChanged

        _ctrl.selectedEspece = CMBespece.Text

        CMBrace.DataSource = _ctrl.ListeRace

        CMBrace.SelectedIndex = -1

    End Sub

#End Region

End Class